package com.yoshino.leetcode.oneHundred.twentysixth;

class Solution {
    public boolean isNumber(String s) {
//        return s.matches("[\\s]*([+,-]?((\\d+\\.)|(\\d+\\.\\d+)|(\\.\\d+)|(\\d+)))([e,E][+,-]?\\d+)?[\\s]*");
        if (s == null) {
            return false;
        }
        s = s.trim();
        if (s.length() == 0) {
            return false;
        }
        // 符号
        int ind = 0;
        if ('+' == s.charAt(0) || s.charAt(0) == '-') {
            ind = 1;
        }
        int end = s.length();
        if (s.contains("e") || s.contains("E")) {
            end = s.indexOf('e') == -1 ? s.indexOf('E') : s.indexOf('e');
        }
        if (s.contains(".")) {
            // 小数
            if (!xiao(s.substring(ind, end))) {
                return false;
            }
        } else {
            if (!zheng(s.substring(ind, end))) {
                return false;
            }
        }
        // 是否有e
        if (end != s.length()) {
            String sub = s.substring(end + 1);
            if (!sub.matches("[+,-]{0,1}\\d+")) {
                return false;
            }
        }
        return true;
    }

    private boolean xiao(String s) {
        return s.matches("\\d+\\.") || s.matches("\\d+\\.\\d+") || s.matches("\\.\\d+");
    }

    private boolean zheng(String s) {
        return s.matches("\\d+");
    }

    public int strToInt(String str) {
        str = str.trim();
        if (str.length() == 0) {
            return 0;
        }
        long res = 0;
        int i = 0;
        boolean flag;
        if (str.length() > 1 && (str.charAt(0) == '+' || str.charAt(0) == '-') && Character.isDigit(str.charAt(1))) {
            flag = str.charAt(0) == '+';
            i = 1;
        } else if (Character.isDigit(str.charAt(0))) {
            flag = true;
        } else {
            return 0;
        }
        while (i < str.length() && Character.isDigit(str.charAt(i))) {
            res = res * 10 + str.charAt(i) - '0';
            if (flag) {
                if (res > Integer.MAX_VALUE) {
                    return Integer.MAX_VALUE;
                }
            } else {
                if (-res < Integer.MIN_VALUE) {
                    return Integer.MIN_VALUE;
                }
            }
            i++;
        }
        return (int)(flag ? res : -res);
    }
}